"""对FOF进行统计,生成两个json,
一个是FOF持仓的代码与基金名称对应json,一个是按基金经理统计的持仓json"""

import os
import json
import re

### 使用文件
BASE_PATH = os.path.dirname(__file__)
FOF_LIST = os.path.join(BASE_PATH, r'FOF表(2022-02-09)(排序).json')
FOF_DATA = os.path.join(BASE_PATH, r'全FOF持仓(2021-12-31).json')

### 读入文件
with open(FOF_LIST, 'rb') as f:
  text = f.read().decode()
  fof_list = json.loads(text)
  
with open(FOF_DATA, 'rb') as f:
  text = f.read().decode()
  fof_data = json.loads(text)

### 基金代码表,{'代码': '名称'}
funds = {}
### 统计基金经理,{'经理名称':[[FOF表], [持有基金表(仅代码)], 总规模]}
### 最后再把持有基金表部分从仅代码换成完整名称
managers = {}

### 开始统计并制作funds和managers
codeReg = re.compile('[(](\d{5,6})[)]') # 查找基金代码的正则表达式
for x in fof_list:
  fof = x[0] # fof名称
  name = x[1] # 基金经理名字
  scale = x[2] # fof规模
  ## 在managers中加入基金经理
  if not (name in managers):
    managers[name] = [[], [], 0.0]
  ## 添加该FOF的信息
  managers[name][0].append(fof)
  managers[name][2] += scale
  ## 从fof记录表中查找持仓基金,更新funds和managers
  if fof in fof_data:
    flist = fof_data[fof]
    for fund in flist:
      code = codeReg.search(fund).group(1)
      if not (code in funds):
        funds[code] = fund
      if not (code in managers[name][1]):
        managers[name][1].append(code)
        
### 最后更新managers的持仓表,把仅代码换成完整名称
for name in managers:
  newFundlist = [funds[x] for x in managers[name][1]]
  managers[name][1] = newFundlist

### 写入文件
#with open(os.path.join(BASE_PATH, r'开基表(2021_12_31).json'), 'wb') as f:
#  f.write(json.dumps(funds, ensure_ascii=False).encode())
#with open(os.path.join(BASE_PATH, r'FOF按基金经理统计表(2021_12_31).json'), 'wb') as f:
#  f.write(json.dumps(managers, ensure_ascii=False).encode())
